#ifndef _KRLSCHED_T_H_
#define _KRLSCHED_T_H_

#include <hyper_t.h>
#include <list_t.h>
#include <krlthread_t.h>

#define SCHD_PRI_MIN    THDPRI_MIN         /* 系统最小优先级数值 */
#define SCHD_PRI_MAX    THDPRI_MAX         /* 系统最大优先级数值 */

#define CPU_CORE_MAX    4                  /* 系统最大CPU个数 */

/* 进程调度和进程可抢占标志 */

#define SCHD_NONEED_FLAG    (0 << 0)     /* 不需要调度 */
#define SCHD_NEED_FLAG      (1 << 0)     /* 需要调度 */
#define SCHD_NEED_MASK      1

#define SCHD_PMPT_FLAG      (1 << 0)     /* 进程可抢占 */
#define SCHD_DISPMPT_FLAG   (1 << 1)     /* 进程不可抢占 */

/* 进程链表头 */

typedef struct s_THDLST
    {
    list_t     headlist;    /* 链表头 */
    thread_t * currunthd;   /* 该链表头中正在运行的进程的指针 */
    uint_t     count;       /* 计数器变量 */
    } thdlst_t;

/* 进程调度数据结构 */

typedef struct s_SCHDATA
    {
    spinlock_t lock;                    /* 结构体自旋锁 */
    uint_t     cpuid;                   /* CPU ID */
    uint_t     schflag;                 /* 调度标志 */
    uint_t     preemptflag;             /* 内核可抢占标志 */
    uint_t     thdcount;                /* 进程数 */
    uint_t     curthdpri;               /* 当前动态优先级 */
    thread_t * curcpuidlethd;           /* 当前CPU上的空转进程 */
    thread_t * curcpurunthd;            /* 当前CPU上正在运行的进程 */
    thdlst_t   thdlst[SCHD_PRI_MAX];    /* thdlst_t 结构体数组 */
    } schdata_t;

/* 进程调度数据结构容器 */

typedef struct s_SCHCLASS
    {
    spinlock_t lock;                    /* 结构体自旋锁 */
    uint_t     cpunbr;                  /* CPU数量 */
    uint_t     thdtotalnbr;             /* 进程总数量 */
    schdata_t  schdata[CPU_CORE_MAX];   /* schdata_t 结构体数组 */
    } schclass_t;


#endif
